package org.vic.strategy.duckDemo;

/**
 * 测试入口
 */
public class Main {
    public static void main(String[] args) {
        // 绿头鸭
        MallardDuck mallardDuck = new MallardDuck();
        mallardDuck.myName();
        mallardDuck.swim();
        mallardDuck.performFly();
        mallardDuck.performQuack();
        System.out.println("---- 翅膀断了，失声了 ----");
        // 动态改变 行为类型
        mallardDuck.setFlyBehavior(new FlyNoWay());
        mallardDuck.setQuackBehavior(new QuackNoWay());
        mallardDuck.performFly();
        mallardDuck.performQuack();

        System.out.println("---------------- 华丽分割线 ---------------");

        // 模型鸭
        ModelDuck modelDuck = new ModelDuck();
        modelDuck.myName();;
        modelDuck.swim();
        modelDuck.performFly();
        modelDuck.performQuack();
        System.out.println("---- 主人给模型鸭加了个火箭助推器让其飞翔 ---");
        modelDuck.setFlyBehavior(new FlyWithRocket());
        modelDuck.performFly();

        System.out.println("---------------- 华丽分割线 ---------------");

        DuckCall duckCall = new DuckCall(new QuackWithGG());
        System.out.println("-- 呱呱叫的鸭鸣器 --");
        duckCall.quack();
        duckCall = new DuckCall(new QuackWithZZ());
        System.out.println("-- 吱吱叫的鸭鸣器 --");
        duckCall.quack();

        /*
            这就是 -> 策略模式！！！
            1、定义：
                定义了算法组，分别分装起来，让它们之间可以相互替换，此模式让算法的变化独立于使用算法的客户。
            2、对应到例子来说明：
                算法组对应的就是 FlyBehavior/ QuackBehavior 及其实现，每个实现对应一种不同算法；
                而使用算法的客户就是鸭子超类，该类无需知道算法的实现，其子类只需要指定适用的算法即可；
                如果子类需要的算法不存在，也无需改动超类，只需要添加新的算法实现类，然后在子类中指定即可，不会对其他子类造成影响；

         */
    }
}
